const hello = "hello ts";
document.querySelectorAll(".app")[0].innerHTML = hello;
/**
 * 1.基础类型
 */

/**
 * 一、布尔、数字、字符串类型
 */
const bool: boolean = true;
const num: number = 10;
const str: string = "hello da";

/**
 * 二、元组类型
 * 限制长度个数、类型一一对应
 */
const tuple: [string, number, boolean] = ["dada", 10, true];
// 像元组中增加数据，只能增加元组中存放的类型
tuple.push("大大大");

/**
 * 三、数组
 * 声明数组中元素数据类型
 */
const arr1: number[] = [1, 2, 3];
const arr2: string[] = ["1", "2", "3"];
const arr3: (number | string)[] = [1, "2", 3];
// 泛型方式来声明
const arr4: Array<number | string> = [1, "2", 3];

/**
 * 四、枚举类型
 */
enum USER_ROLE {
    USER, // 默认从0开始
    ADMIN,
    MANAGER
}
// { 0: "USER", 1: "ADMIN", 2: "MANAGER", USER: 0, ADMIN: 1, MANAGER: 2 }

// 异构枚举
enum USER_ROLE2 {
    USER = "user",
    ADMIN = 1,
    MANAGER
}
// 常量枚举
const enum USER_ROLE3 {
    USER,
    ADMIN,
    MANAGER
}

/**
 * 五、any类型
 * 不进行类型检测
 */
const arr: any = ["大大", true, {name: "dada"}];

/**
 * 六、null和 undefined
 * 任何类型的子类型，如果strictNullChecks的值为true，则不能把null和undefined赋给其他类型
 */
// let name: number | boolean;
// name = null

/**
 * 七、void 类型
 * 只能接受null，undefined。一般用于函数的返回值
 */
let a: void;
a = undefined;
// 严格模式下不能将null赋予给 void

/**
 * 八、never类型
 * 任何类型的子类型，never代表不会出现的值。不能把其他类型赋值给never
 */
function error(message: string): never {
    throw new Error("err");
}
function loop(): never {
    while (true) { }
}
function fn(x: number | string) {
    if (typeof x === "number") {

    } else if (typeof x === "string") {

    } else {
        console.log(x); // never
    }
}

/**
 * 九、Symbol类型
 * Symbol表示独一无二
 */
const s1 = Symbol("key");
const s2 = Symbol("key");
// console.log(s1 == s2); // false


/**
 * 十、BigInt 类型
 */
const num1 = Number.MAX_SAFE_INTEGER + 1;
const num2 = Number.MAX_SAFE_INTEGER + 2;
// console.log(num1 == num2); // true

let max: bigint = BigInt(Number.MAX_SAFE_INTEGER);
// console.log(max + BigInt(1) === max + BigInt(2)); // false
// number 类型和 bigInt 类型是不兼容的

/**
 * 十一、object 对象类型
 * object 表示非原始类型
 */
const create = (obj: object): void => {};
create({});
create([]);
create(function (){})
